package com.shop.util;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

import com.g3net.tool.Base64;
import com.g3net.tool.ByteUtils;
import com.g3net.tool.CachedClientFactory;
import com.g3net.tool.EscapeUtil;
import com.g3net.tool.HttpUtils;
import com.g3net.tool.MD5;
import com.g3net.tool.NumberUtils;
import com.g3net.tool.Path;
import com.g3net.tool.StringUtils;


/**
 * 处理支持支付组件客户端的收费相关的逻辑
 * 只需要给客户端下发订单信息，扣费相关信息由支付组件与支付平台交互
 * @author yuxiaowei
 *
 */
public class FeeTools {
	private static Logger log = Logger.getLogger("fee");
	public static String KEY="3g_fee";//通用密钥
	public static String SHEQU_KEY="3GBUbuild431*(&^^&";//社区密钥
	private static String CID="G";//标识信息，不可以太长，否则产生的加密串会很长不利于用户输入
	//http://localhost:8080/feeserver/callback?type=1_Xz4=_20_0&jf=0c55105fda9c0225e369ae562d54d33d&ord=114368&mid=fdfsf
	private static boolean isFee=true;//是否需要收费，用于控制收费的总开关
	//登录注册接口/feeserver/fee/lr?sid=2&cid=2111111&proid=1&types=0_1&bid=801
	public static String MYFEE="192.168.112.72";
	public static String BCFEE="61.145.121.100:83";
	public static String CALLBACK="192.168.1.24:8081";//充值回调接口
	public static String ENTRANCE="61.145.124.200";//用户中心、书包、充值 消费等业务入口
	
	private static String GZ_FEE_CACHE_IP="192.168.112.90:11213";//GZ收费信息cache
	private static String SH_FEE_CACHE_IP="192.168.56.69:11213";//SH收费信息cache
	public static String GZ_FEE_CACHE_NAME="GZ_FEE_CACHE_NAME";//在map中注册的cache名称
	public static String SH_FEE_CACHE_NAME="SH_FEE_CACHE_NAME";//在map中注册的cache名称
	
	private static int TYPE_CONGZHI=1;//充值
	private static int TYPE_XIAOFEI=2;//冲动消费
	
	
	/**
	 * 书籍对应的收费业务

	 * 全本书籍	1全本单本购买类型
				2全本包月套餐购买类型
	        连载书籍	3连载按章购买类型
	  			4连载包月套餐购买类型
	 */
	public static final int FEE_STATUS_ERROR=0;//验证失败，简介页可以看，但是没有购买按钮。看书页不提供查看
	public static final int FEE_STATUS_OK=1;//验证通过,根据返回的收费业务类型返回相应的页面
	public static final int FEE_STATUS_NOT_ENOUGH=2;//验证未通过,因为用户余额不足
	public static final int FEE_STATUS_NOT_LOGON=3;//验证未通过,因为用户没有登录
	
	public static final int FEE_TYPE_QUANBEN_DANBEN=1;
	public static final int FEE_TYPE_QUANBEN_BAOYUE=2;
	public static final int FEE_TYPE_LIANZAI_ZHANGJIE=3;//这种业务类型全本书籍也可以支持
	public static final int FEE_TYPE_LIANZAI_BAOYUE=4;
	
	public static final int FEE_TYPE_DASHANG=5;//打赏消费类型
	public static final int FEE_TYPE_UPDATE=6;//升级黄金会员，需要扣除年费,可以享受书籍打折
	
	//收费业务的相关属性
	public static final String FEE_PAYTYPE_PROPERTY_PRICE="price";//收费价格
	public static final String FEE_PAYTYPE_PROPERTY_NUMBER="number";//全本包月套餐最多可选的书数量 
	public static final String FEE_PAYTYPE_PROPERTY_BOOKIDS="bookids";//全本包月套餐里的书籍
	public static final String FEE_PAYTYPE_PROPERTY_MENUIDS="menuids";//若干章节id,使用","分隔
	public static final String FEE_PAYTYPE_PROPERTY_PRICES="prices";//若干章节的价格,使用","分隔
	
	public static final int[] BUY_CHAPTERS=new int[]{1,5,10};//一次购买收费章节数
	
	//用户对某本书的阅读权限
	public static final int USER_PERMISSION_NO=0;//没有权限
	public static final int USER_PERMISSION_PART=1;//部分权限
	public static final int USER_PERMISSION_YES=2;//有全部权限
	public static final int USER_MIN_BALANCE=10;//用户账户最小余额，单位是谷粒，1元相当于100谷粒
	
	public static final int BOOK_CHAPTER_FREE=0;//免费章节
	public static final int BOOK_CHAPTER_FEE_BUY=1;//收费已购买章节
	public static final int BOOK_CHAPTER_FEE_NOT_BUY=2;//收费未购买章节
	
	//接口返回状态值
	public static final String FEE_INTERFACE_SUCCESS="success";
	public static final String FEE_INTERFACE_ERROR="error";
	public static final String FEE_INTERFACE_SPILT1=",";//同类数据的分割符
	public static final String FEE_INTERFACE_SPILT2="\r\n";//行分割符
	public static final String FEE_INTERFACE_SPILT3="||";//不同字段分隔符
	public static final String FEE_INTERFACE_SPILT3_1="\\|\\|";//不同字段分隔符,正则表达式使用
	public static final String FEE_INTERFACE_KEY="BOOKVIP";//与书城通信的密码
	//二进制转字符串编码
	public static final String ENCODE="iso-8859-1";
	public static final long SESSION_TIMEOUT=600000;//600秒
	static
	{
		init();
	}
	public static void  init()
	{
		log.debug("===刷新收费相关配置信息==");
//		Properties ps=new Properties();
		try{
			//ps.load(Path.getResource("/constant.properties"));
			String ss=null;
//			ps.load(Path.getClassPathResource("constant.properties"));
//			ss=ps.getProperty("TIMEOUT").trim();
			ss=CommonConfig.readValue(Path.getClassPath("common.xml"), "isfee");
			if(StringUtils.hasText(ss))
			{
				if(ss.equalsIgnoreCase("0"))
				{
					isFee=false;
				}else{
					isFee=true;
				}
			};//
			
			ss=CommonConfig.readValue(Path.getClassPath("common.xml"), "BCFee");
			if(StringUtils.hasText(ss))
			{
				BCFEE=ss;
			};//
			ss=CommonConfig.readValue(Path.getClassPath("common.xml"), "myFee");
			if(StringUtils.hasText(ss))
			{
				MYFEE=ss;
			};//
			
			ss=CommonConfig.readValue(Path.getClassPath("common.xml"), "callback");
			if(StringUtils.hasText(ss))
			{
				CALLBACK=ss;
			};//
			ss=CommonConfig.readValue(Path.getClassPath("common.xml"), "GZ-feecache");
			if(StringUtils.hasText(ss))
			{
				GZ_FEE_CACHE_IP=ss;
			};//
			ss=CommonConfig.readValue(Path.getClassPath("common.xml"), "entrance");
			if(StringUtils.hasText(ss))
			{
				ENTRANCE=ss;
			};//
			boolean isok=CachedClientFactory.regist(GZ_FEE_CACHE_NAME,
					GZ_FEE_CACHE_IP,CachedClientFactory.CachedClientType.MemCachedClient);
			log.info("初始化收费信息缓存服务器："+GZ_FEE_CACHE_IP+" isok="+isok);
			
			ss=CommonConfig.readValue(Path.getClassPath("common.xml"), "SH-feecache");
			if(StringUtils.hasText(ss))
			{
				SH_FEE_CACHE_IP=ss;
			};//
			isok=CachedClientFactory.regist(SH_FEE_CACHE_NAME,
					SH_FEE_CACHE_IP,CachedClientFactory.CachedClientType.MemCachedClient);
			log.info("初始化收费信息缓存服务器："+SH_FEE_CACHE_IP+" isok="+isok);
		}catch (Exception e) {
			// TODO: handle exception
//			e.printStackTrace();
			log.error("",e);
		}
	}
	
	/**
	 * 同时设置广州和上海的cache。
	 * @param keyword
	 * @param content
	 * @param time 单位是秒,为0表示不过期
	 * @return
	 */
	public static  boolean setMemcache(String keyword,String content,int time)//异步操作
	{
//		String name=GZ_FEE_CACHE_NAME;
//		if(Config.isshanghai==1)//判断使用哪个缓存
//		{
//			name=SH_FEE_CACHE_NAME;
//		}
		
		if(time>0)
		{
			CachedClientFactory.getCachedClient(GZ_FEE_CACHE_NAME).set(keyword, content,time);
			CachedClientFactory.getCachedClient(SH_FEE_CACHE_NAME).set(keyword, content,time);
		}else{
			CachedClientFactory.getCachedClient(GZ_FEE_CACHE_NAME).set(keyword,content);
			CachedClientFactory.getCachedClient(SH_FEE_CACHE_NAME).set(keyword, content);
		}
		return true;
	}
	public static  String getMemcache(String keyword)//同步操作
	{
		String name=GZ_FEE_CACHE_NAME;
		if(Config.isshanghai==1)//判断使用哪个缓存
		{
			name=SH_FEE_CACHE_NAME;
		}
		return (String)CachedClientFactory.getCachedClient(name).get(keyword);
	}
	public static boolean delMemcache(String key){//异步操作
		CachedClientFactory.getCachedClient(GZ_FEE_CACHE_NAME).delete(key);
		CachedClientFactory.getCachedClient(SH_FEE_CACHE_NAME).delete(key);
		return true;
	}
	/**
	 * 从收费服务器获取外部订单号
	 * @param cid 客户端标识
	 * @param bid 业务串
	 * @return 返回可用的外部订单号，与cid以及bid关联,返回null表示注册失败
	 */
//	public static String getOrd(String cid,String bid){
//		String u="http://"+MYFEE+"/feeserver/fee/lr?sid=&proid=1&types=0_1&cid="+cid+"&bid="+bid;
//		log.debug("url==="+u);
//		String callback="http://"+CALLBACK+"/feeserver/bookinterface/callback.jsp?bid="+bid+"&money="+0+"&payord=0&paytype=0&state=";
//		String[] ss=null;
//		try {
//			ss = parseData(HttpUtils.getBytes(u));
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			log.error("", e);
//		}
//		if(ss!=null&&ss.length==2)//返回数据中包括两串字符：状态信息+收费地址信息
//		{
//			String sessions=ss[0];
//			String feelinks=ss[1];//不处理扣费地址信息
//			log.debug("sessions="+sessions+" feelinks="+feelinks);
//			if(StringUtils.hasText(sessions))
//			{
//				if(StringUtils.hasText(sessions))//以下解析状态信息，以||分割
//				{
//					String[] session_t=sessions.split("\\|\\|");//272G_3_0_null_ ||423G_1_20__bid=1
//					if(session_t.length!=2)
//					{
//						//http://192.168.1.24:8081/bookDataSpider/callback.jsp
//						callback=callback+"1";
//						String s=HttpUtils.get(callback,"gbk");
//						log.debug("通知充值业务接口 callback="+callback+" result="+s);
//						return null;
//					}
//					callback=callback+"2";
//					String s=HttpUtils.get(callback,"gbk");
//					log.debug("通知充值业务接口 callback="+callback+" result="+s);
//					String[] t=session_t[session_t.length-1].split("_");//取最后一条状态信息，用于标示用户按软件收费的信息423G_1_20__bid=1
//					return t[0]+"_"+1;
//				}
//			}
//		}
//		callback=callback+"1";
//		String s=HttpUtils.get(callback,"gbk");
//		log.debug("通知充值业务接口 callback="+callback+" result="+s);
//		log.error("获取外部订单号失败 url="+u);
//		return null;
//	}
	/**
	 * 构造充值bid,因为使用"_"作为分隔符，所以每个单独的字段中不能包含"_"
	 * @param gg 		用户gg号
	 * @param sid		登录sid 
	 * @param ka		用户标识
	 * @param platform	平台
	 * @param version	版本
	 * @return
	 */
	public static String createCZBid(String gg,String sid,String ka,String ip,String platform,String version){
		if(platform!=null)platform=platform.replace("_", "");
		return TYPE_CONGZHI+"_"+ka+"_"+gg+"_"+sid+"_"+ip+"_"+platform+"_"+version;
	}
	/**
	 * 生成book收费信息的memcahe key
	 * @param content
	 * @return
	 */
	public static String generatFeeKey(String content){
		return "bookfee_"+content;
	}
	/**
	 * 生成用户账户信息的memcahe key
	 * @param content
	 * @return
	 */
	public static String generatUserKey(String content){
		return "user_"+content;
	}
	/**
	 * 生成用户购书状态信息的memcahe key
	 * @param content
	 * @return
	 */
	public static String generatUBKey(String content){
		return "userbook_"+content;
	}

//	/**
//	 * 返回章节扣费选择页面
//	 * @param bookid
//	 * @return
//	 * @throws Exception
//	 */
//	public static byte[] validate(int bookid) throws Exception{
//		ByteArrayWriter  out=null;
//		out=new ByteArrayWriter();
//		out.writeByte(0x06);//弹出页面
//		out.writeByte(0x03);//页面类型为章节扣费
//		
//		//页面头信息
//		byte[] t=getPageHead(bookid);
//		out.writeInt(t.length);
//		out.write(t);
//		
//		//左软键的定义
//		out.writeUTF("购买");
//		out.writeUTF("anchor://3g.cn");
//		//右软键的定义
//		out.writeUTF("取消");
//		out.writeUTF("back");
//		
//		//pagebody
//		PressPages ppage = new PressPages();
//		out.write(ppage.getText("所选章节为付费章节，原价 0 谷粒 ，VIP折扣价 0 谷粒",0x01));
//		out.write(ppage.getBR(0x01, 0x01));
//		
//		byte[] d=getMutilSelect();
//		out.writeByte(0x10);
//		out.writeInt(d.length);
//		out.write(d);
//		out.writeByte(0x00);//页面结束符
//		return out.toByteArray();
//	}
//	public static byte[] getPageHead(int bookid) 
//	{
//		byte[] rtData = null;
//		WriteStream ws = new WriteStream();
//		try{
//			ws.writeInt(bookid);//书id
//			ws.writeInt(95);//用户折扣，如九五折，表示未95
//			ws.writeInt(10);//章节数
//			for (int i = 0; i < 10; i++) {
//				ws.writeInt(i+1);//章节id
//				ws.writeInt(50);//章节原价
//			}
//			rtData = ws.toByteArray();
//			
//		}catch(Exception ex){}
//		finally 
//		{
//			if(ws!=null)
//				try {
//					ws.close();
//				} catch (IOException e) {
//				
//				}
//		}
//		
//		return rtData;
//	}
//	public static byte[] getMutilSelect() 
//	{
//		byte[] rtData = null;
//		WriteStream ws = new WriteStream();
//		try{
//			ws.writeByte(0x11);
//			ws.writeUTF("cids");
//			ws.writeInt(5);
//			ws.writeInt(10);
//			for (int i = 0; i < 10; i++) {
//				ws.writeUTF("章节"+(i+1));//章节名
//				ws.writeUTF(String.valueOf(i+1));//章节id
//				if(i%2==0)
//				{
//					ws.writeByte(0x00);
//				}else{
//					ws.writeByte(0x01);
//				}
//			}
//			ws.writeByte(0x01);
//			rtData = ws.toByteArray();
//			
//		}catch(Exception ex){}
//		finally 
//		{
//			if(ws!=null)
//				try {
//					ws.close();
//				} catch (IOException e) {
//				
//				}
//		}
//		
//		return rtData;
//	}
	/**
	 * 生成具有实效性的加密串，用于验证消费请求的有效性，防止重复刷新。
	 */
	public static String generateValidateStr(String sid,String key){
		String src=sid+FEE_INTERFACE_SPILT3+System.currentTimeMillis();
		return encrypt(src, key);
	}
	/**
	 * 验证具有实效性的加密串，用于验证消费请求的有效性，防止重复刷新。
	 */
	public static boolean validateStr(String des,String sid,String key){
		String src=deEncrypt(des, key);
		if(src!=null)
		{
			try{
				String[] ss=src.split(FEE_INTERFACE_SPILT3_1);
				long time=NumberUtils.parseLong(ss[1]);//加密串中的时间，单位为毫秒
				long now=System.currentTimeMillis();//当前时间，单位为毫秒
				if(sid.equalsIgnoreCase(ss[0])&&(now-time)<=SESSION_TIMEOUT)
				{
					return true;
				}
			}catch (Exception e) {
				// TODO: handle exception
				log.error("请求验证串无效 des="+des, e);
				return false;
			}
		}
		return false;
	}
	/**
	 * 另一种异或，与社区保持一致,用于加解密数据
	 * @param srcByte
	 * @param keyByte
	 * @return
	 */
	public static byte[] xor(byte[] srcByte, byte[] keyByte) {
        byte[] snNum = new byte[srcByte.length];
        /**第一步: 将源串的char[]与密钥的char[]进行异或，保存int值**/
        for (int i = 0, j = 0; i < srcByte.length; i++, j++) {
            if (j == keyByte.length)
                j = 0;
            snNum[i] = (byte) (srcByte[i] ^ keyByte[j]);
        }
        return snNum;
    }
	/**
	 * 与社区交互使用
	 * @param src
	 * @param key
	 * @return
	 */
	public static String encrypt1(String src,String key){
		try{
			byte[] b=xor(src.getBytes("utf-8"), key.getBytes("utf-8"));
			return Base64.encodeBytes(b);
//			return new String(b,"utf-8");
		}catch (Exception e) {
			// TODO: handle exception
			log.error("加密错误", e);
			return null;
		}
	}
	/**
	 * 与社区交互使用
	 * @param src
	 * @param key
	 * @return
	 */
	public static String deEncrypt1(String src,String key){
		try{
			byte[] b=xor(Base64.decode(src), key.getBytes("utf-8"));
//			byte[] b=ByteUtils.xor(src.getBytes("utf-8"), key.getBytes("utf-8"));
			return new String(b,"utf-8");
		}catch (Exception e) {
			// TODO: handle exception
			log.error("解密错误", e);
			return null;
		}
	}
	/**
	 * 加密 ：使用异或加密后采用base64编码返回字符串
	 * @param src
	 * @param key
	 * @return
	 */
	public static String encrypt(String src,String key){
		try{
			byte[] b=ByteUtils.xor(src.getBytes("utf-8"), key.getBytes("utf-8"));
			return Base64.encodeBytes(b);
//			return new String(b,"utf-8");
		}catch (Exception e) {
			// TODO: handle exception
			log.error("加密错误", e);
			return null;
		}
	}
	/**
	 * 解析收费服务器接口的返回数据
	 * 如果解析出现异常，则直接返回null，无需扣费。
	 * @param b
	 * @return
	 */
	private static String[] parseData(byte[] b)
	{
		try{
			if(b==null||b.length==0)return null;
			ByteArrayInputStream bin=new ByteArrayInputStream(b);
			DataInputStream in=new DataInputStream(bin);
			int length=in.readInt();
			if(length>2000)
			{
				return null;
			}
			String[] ss=new String[length];
			for (int i = 0; i < length; i++) {
				ss[i]=in.readUTF();
			}
			return ss;
		}catch (Exception e) {
			// TODO: handle exception
			log.error("",e);
			return null;
		}
	}
	/**
	 * 返回实际订单id
	 * @param ord 网络传输用的ord，(实际订单号+验证串）加密后串
	 * @return
	 */
	public static long validateOrd(String ord){
		//生产中需要使用加密串,所以要先解密
		String ord1=deEncrypt(ord, KEY);//解密
		if(!StringUtils.hasText(ord1)||!ord1.matches("[0-9]+"+CID))
		{
			log.error("订单ID无效[ord="+ord+" 解密后 ="+ord1+"]");
			return 0;
		}
		try{
			ord1=ord1.substring(0,ord1.length()-CID.length());
		}catch (Exception e) {
			// TODO: handle exception
			log.error("订单ID无效[ord="+ord+" 解密后 ="+ord1+"]"); 
			return 0;
		}
		
		return NumberUtils.parseLong(ord1);
	}
	/**
	 * 解密 ：使用异或解密后采用utf8编码返回字符串
	 * @param src
	 * @param key
	 * @return
	 */
	public static String deEncrypt(String src,String key){
		try{
			byte[] b=ByteUtils.xor(Base64.decode(src), key.getBytes("utf-8"));
//			byte[] b=ByteUtils.xor(src.getBytes("utf-8"), key.getBytes("utf-8"));
			return new String(b,"utf-8");
		}catch (Exception e) {
			// TODO: handle exception
			log.error("解密错误", e);
			return null;
		}
	}
	/**
	 * 生成网络传输使用的ord
	 * @param orderId 实际订单号
	 * @return
	 */
	public static String generateOrd(long orderId){
		//生产中需要使用加密串
		if(orderId<=0)
		{
			return " ";
		}
//		return orderId+CID;
		return encrypt(orderId+CID,KEY);
	}
	public static void main(String[] args) throws Exception {
//		String s="X19RX1k7_2_60_ _";
//		System.out.println(s.split("_").length);
//		boolean ok=CachedClientFactory.regist(FeeTools.FEE_CACHE_NAME,
//				FeeTools.FEE_CACHE_IP,CachedClientFactory.CachedClientType.MemCachedClient);
//		System.out.println(ok);
//		System.out.println(generateOrd(111));
//		System.out.println(validateOrd(""));
		
//		byte[] d=validate("", "fffff","801");
//		System.out.println(d.length);
//		System.out.println(d.length);
//		System.out.println(ByteUtils.format(d));
//		String t=MD5.MD5generator("123456789012346"+"0");
//		System.out.println(t);
//		String s=EscapeUtil.unescapeUrl("http%3A%2F%2Fethioforum.org%2Fwp%2Fwp-content%2Fuploads%2F2009%2F10%2Fteddy_new.mp3", "utf-8");
//		System.out.println(s);
//		CachedClientFactory.getCachedClient(FEE_CACHE_NAME).set("test", "fffffffffff");
//		System.out.println(CachedClientFactory.getCachedClient(FEE_CACHE_NAME).get("session_5_801"));
//		TInteger status=new TInteger();
//		int[] tt=isneedBuy("223", "55", 2221, 0, status);
//		try{
//			System.out.println(ArrayUtils.toString(tt));
//		}catch (Exception e) {
//			// TODO: handle exception
//			e.printStackTrace();
//		}
//	
//		StringBuilder sb=new StringBuilder();
//		sb.append("a");
//		String s1=sb.toString();
//		sb.append("b");
//		String s2=sb.toString();
//		System.out.println(s1+","+s2);
//		String s=generateValidateStr("fffffffffff", FEE_INTERFACE_KEY);
//		System.out.println("加密的验证串："+s);
//		System.out.println(EscapeUtil.escapeUrl(s, "utf-8"));
//		TimeUnit.SECONDS.sleep(40);
//		System.out.println("验证结果："+validateStr(s, "fffffffffff", FEE_INTERFACE_KEY));
//		UserInfo ui=getUserInfo("66917319", "f");
		
		//充值
//		String gg="126634913";
//		String payord="1000000";
//		int money=11;
//		String md5=MD5.MD5generator(gg+payord+money+"BOOKVIP");//MD5 (GGID+ORDID+Money+"BOOKVIP")
//		String s=HttpUtils.get(url, "utf-8");
//		System.out.println(s);
		
		//消费
		String gg="126741368";
		String id="2a85f2d8f7f74d01b3c0aad2ed3a386c";
		String md5="8e3f2a12575d13c893b478765e6d5d10";
		
		String dataXml="<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?><data><paytype id=\"3\"><property name=\"money\">30</property><property name=\"bookid\">133999</property><property name=\"menuids\">4,5,6,7,8</property><property name=\"date\">2010-11-26 15:11:42</property></paytype></data>";
		System.out.println(dataXml);
		md5=MD5.MD5generator(gg+dataXml+FeeTools.FEE_INTERFACE_KEY);
		String url="http://"+FeeTools.BCFEE+"/consume.aspx?ggid="+gg+"&id="+id+"&md5="+md5+"&test=0";
		Map<String, String> temp=new HashMap<String, String>();
		temp.put("data", dataXml);
		long start=System.currentTimeMillis();
		String result=HttpUtils.post(url, temp, "utf-8", "utf-8");
		System.out.println("times="+(System.currentTimeMillis()-start));
		System.out.println("result="+result);
		
		
		
//		String s=new String(HttpUtils.getBytes("http://192.168.112.72/book30/bookinterface/newMyBooklist.txt"),"utf-8");
//		System.out.println(s);
//		StringBuilder sb=new StringBuilder();
//		sb.append("fdsf");sb.append("\r\n");
//		System.out.println(sb.toString().replace("\r\n", ""));
//		System.out.println(MD5.MD5generator(sb.toString()));
//		System.out.println(MD5.MD5generator(gg+dataXml+FeeTools.FEE_INTERFACE_KEY));
//		System.out.println(md5);
//		System.out.println(EscapeUtil.escapeUrl("#", "utf-8"));
		String s="119294993";
		String ggnum=FeeTools.encrypt1(s, FeeTools.SHEQU_KEY);
		ggnum=ggnum.replace("+", "-");ggnum=ggnum.replace("/", "_");
		ggnum=EscapeUtil.escapeUrl(ggnum,"utf-8");
		url="http://192.168.1.163/NewUserService/newGGGetPhoneNum.aspx?serial="+ggnum;
		s=HttpUtils.get(url, "utf-8");
		System.out.println(s);
		s=s.replace("-", "+");s=s.replace("_", "/");
		s=deEncrypt1(s, FeeTools.SHEQU_KEY);
		System.out.println(s);
//		HttpUtils.shutdown();
		CachedClientFactory.clearAll();
//		String s=FeeTools.getOrd("0000000000000000", "1_3232432423");
//		System.out.println("1_JS11288169116222176122700048_125483768_745dfc8c69bf11f3d1c0708a39c1bf12_192.168.214.117".length());
	}
}
